package agenda;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.io.Serializable;

/**
 * Classe representativa de um contato
 * 
 * @author emerson borges - emerson.borges@ccc.ufcg.edu.br
 * @author rafael lima    - rafael.ufcg10@gmail.com
 */
public class Contato extends Pessoa implements  Comparable<Contato>, Serializable{
		
	private static final long serialVersionUID = 3428838043095431863L;
	private String endereco;
	private String aniversario;
	private String telefone;
	private List<FormaDeContato> formasDeContato;
	
	/**
	 * Construtor de um contato
	 * 
	 * @param nome - nome do contato
	 * @param endereco - endereco do contato
	 * @param aniversario - data de aniversario do contato
	 * @param formasContato - forma de contato do contato
	 * @throws Exception 
	 */
	public Contato(String nome, String endereco, String aniversario, String telefone, ArrayList<FormaDeContato> formasDeContato) throws Exception {
		
		super(nome);		
		
		if(endereco.equals("") && aniversario.equals("") && telefone.equals("") && formasDeContato.equals("")){
			throw new Exception("Informe os valores corretos.");
		}else if(nome.equals(null) && endereco.equals(null) && aniversario.equals(null) && telefone.equals(null) && formasDeContato.equals(null)){
			throw new Exception("Informe os valores corretos.");
		}
		
		this.endereco = endereco;
		this.aniversario = aniversario;
		this.telefone = telefone;
		this.formasDeContato = formasDeContato;
		
	}

	/**
	 * Metodo para recuperar o endereco de um contato
	 * 
	 * @return endereco
	 */
	public String getEndereco() {
		return endereco;
	}

	/**
	 * Metodo para modificar o endereco de um contato
	 * 
	 * @param endereco
	 */
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	/**
	 * Metodo para acessar a data de aniversario de um contato
	 * 
	 * @return aniversario
	 */
	public String getAniversario() {
		return aniversario;
	}

	/**
	 * Metodo para modificar a data de aniversario de um contato
	 * 
	 * @param aniversario
	 */
	public void setAniversario(String aniversario) {
		this.aniversario = aniversario;
	}
	
	/**
	 * Metodo para acessar o numero do telefone de um contato
	 * 
	 * @return aniversario
	 */
	public String getTelefone() {
		return telefone;
	}

	/**
	 * Metodo para modificar o numero do telefone de um contato
	 * 
	 * @param telefone
	 */
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	/**
	 * Metodo para acessar as formas de contato de um contato
	 * 
	 * @return formasContato
	 */
	public List<FormaDeContato> getFormasDeContato() {
		return formasDeContato;
	}

	/**
	 * Metodo para modificar as formas de contato de um contato
	 * 
	 * @param formasContato
	 */
	public void setFormasContato(ArrayList<FormaDeContato> formasDeContato) {
		this.formasDeContato = formasDeContato;
	}
	
	
	/**
	 * Metodo para remover um formas de contato de um contato
	 * 
	 * @param fContato
	 */
	public void adicionaFormasContato(FormaDeContato fContato){
		formasDeContato.add(fContato);
	}
	
    /**
     * Metodo para remover uma forma de contato de um contato
     * 
     * @param formaDeContato
     */
    public void removeFormasContato(FormaDeContato fContato) {
            formasDeContato.remove(fContato);
    }
    
	SimpleDateFormat formatoData = new SimpleDateFormat("dd/MM/yyyy");   
	Date minhaData = formatoData.parse(aniversario);
	
	/**
	 * Metodo para comparar duas datas de aniversario
	 * 
	 * @param contato
	 * @return boolean
	 */
	public boolean comparaAniversario(Contato contato){
   		if (minhaData.equals(contato.getAniversario())){
   			return true;
		}
   		return false;
	}
	
	public String toString(){
		return String.format("Nome: %s\nEndereco: %s\nAniversario: %s\nFormas de Contato: %s\n", super.toString(), getEndereco(), getAniversario(), getFormasDeContato());
	}
	
	public int compareTo(Contato contato){
		return getNome().compareTo(contato.getNome());
	}
	
	public boolean equals(Object obj){
		if(!(obj instanceof Pessoa)){
			return false;
		}
		Contato outro = (Contato) obj;
		return getNome().equals(outro.getNome()) && getAniversario().equals(outro.getAniversario()) && getEndereco().equals(outro.getEndereco());

	}

}